package commonco

import "wails/schema/enums/busenum"

// @schema_export --ident=schema --json --config=修正
// @schema_go
// @schema_ts
// @cache_go
// @cache_ts
// @alias 修正_脚本
type B修正_脚本 struct {
	B修正

	// @alias 修正目标类型
	X修正目标类型 X修正目标类型
}

// @schema_export --ident=schema --json --config=修正
// @schema_go
// @schema_ts
// @cache_go
// @cache_ts
// @alias 修正_自定义
type B修正_自定义 struct {
	B修正

	// @alias 修正目标类型
	X修正目标类型 X修正目标类型

	// 如果目标类型为字典时
	// @alias 使用模版
	X使用模版 bool

	// @alias 处理器
	C处理器 string

	// @alias 扩展参数
	K扩展参数 string
}

// 场景：副本的关卡需要读表，关卡数使用数值表配置关卡的数量
// @schema_export --ident=schema --json --config=修正
// @schema_go
// @schema_ts
// @cache_go
// @cache_ts
// @alias 修正_读表行数
type B修正_读表行数 struct {
	B修正

	// 查找的数据表名称
	// @alias 查找表名
	C查找表名 string
}

// 通过实例的编号获得对应的值
// 场景：用于修改一个字段的值
// @schema_export --ident=schema --json --config=修正
// @schema_go
// @schema_ts
// @cache_go
// @cache_ts
// @alias 修正_业务读表格
type B修正_业务读表格 struct {
	B修正

	// @alias 修正字段类型
	X修正字段类型 X修正字段类型

	// 查找的数据表名称
	// @alias 查找表名
	C查找表名 string

	// @alias 查找值
	C查找值 X修正查找值选项
	// 用于从修正的主体的属性中的获取名字为【主体属性】的值
	// 该值用于从数据表中查找需要的行
	// @alias 查找对象属性
	C查找对象属性 string

	// @alias 查找值前缀
	C查找值前缀 string

	// @alias 查找方式
	C查找方式 X修正查找方式

	// 查找的表字段
	// @alias 查找表字段
	C查找表字段 string

	// @alias 读取表字段
	D读取表字段 string
}

// 场景：用于生成配置集的数组，例如任务配置编号集合
// @schema_export --ident=schema --json --config=修正
// @schema_go
// @schema_ts
// @cache_go
// @cache_ts
// @alias 修正_业务配置集
type B修正_业务配置集 struct {
	B修正

	// 查找的数据表名称
	// @alias 查找表名
	C查找表名 string

	// @alias 模板
	M模板 string
}

// @schema_export --ident=schema --json --config=修正
// @schema_go
// @schema_ts
// @cache_go
// @cache_ts
// @alias 修正_创建配置集
type B修正_创建配置集 struct {
	B修正
	// @alias 模板
	M模板 string
	// @alias 创建位置
	C创建位置 busenum.C创建位置
	// 查找的数据表名称
	// @alias 查找表名
	C查找表名 string
	// @alias 查找方式
	C查找方式 X修正查找方式
	// 查找的表字段
	// @alias 查找表字段
	C查找表字段 string

	// @alias 修正字段组
	X修正字段组 []*S创建配置集修正字段
}

// @schema_export --ident=schema --json --config=修正
// @schema_go
// @schema_ts
// @cache_go
// @cache_ts
// @alias 修正_创建字典
type B修正_创建字典 struct {
	B修正
	// @alias 创建位置
	C创建位置 busenum.C创建位置
	// 查找的数据表名称
	// @alias 查找表名
	C查找表名 string
	// @alias 查找方式
	C查找方式 X修正查找方式
	// 查找的表字段
	// @alias 查找表字段
	C查找表字段 string
	// 修正的字段的项类型
	// @alias 修正字段项类型
	X修正字段项类型 busenum.X修正字段项类型
	// @alias 修正字段组
	X修正字段组 []*S创建配置集修正字段
}

type S创建配置集修正字段 struct {
	// 需要修正的数组项的字段路径
	// @alias 修正字段路径
	X修正字段路径 string
	// @alias 修正方式
	X修正方式 busenum.C创建字段方式
	// @alias 读取表字段
	D读取表字段 string
	// 用于execl配置时的枚举转换
	// 当【修正方式】为【读取表字段】时才发生作用
	// @alias 读取表值转换
	D读取表值转换 []*S表值转换
}

type S表值转换 struct {
	// @alias 表值
	B表值 string
	// @alias 终值
	Z终值 string
}

// 场景：用于修改数组
// @schema_export --ident=schema --json --config=修正
// @schema_go
// @schema_ts
// @cache_go
// @cache_ts
// @alias 修正_业务读表行
type B修正_业务读表行 struct {
	B修正
	// 查找的数据表名称
	// @alias 查找表名
	C查找表名 string

	// @alias 查找值
	C查找值 X修正查找值选项

	// 用于从修正的主体的属性中的获取名字为【主体属性】的值
	// 该值用于从数据表中查找需要的行
	// @alias 查找对象属性
	C查找对象属性 string

	// @alias 查找值前缀
	C查找值前缀 string

	// @alias 查找方式
	C查找方式 X修正查找方式

	// 查找的表字段
	// @alias 查找表字段
	C查找表字段 string
	// @alias 读取表字段组
	D读取表字段组 []*S业务读表行字段组
}

type S业务读表行字段组 struct {
	// 需要修正的数组项的字段路径
	// @alias 修正字段路径
	X修正字段路径 string
	// @alias 读取表字段
	D读取表字段 string
}

// @schema_go
type X修正查找值选项 int

const (
	X修正查找值选项_使用当前对象属性 X修正查找值选项 = iota
	X修正查找值选项_使用所在对象属性
	X修正查找值选项_使用主体对象属性
	X修正查找值选项_使用主体父对象属性
	X修正查找值选项_使用所在功能对象属性
	// 如果是数组或字典类型的字段，则为索引
	// 如果是基础类型的字段，则与修正的字段相同
	X修正查找值选项_使用字段
)

// @schema_go
// @alias 修正索引方式
type X修正查找方式 int

const (
	// 查找编号
	X修正查找方式_等于 X修正查找方式 = iota
	// 查找指定【查找表字段】的值小于【主体属性】的第一行
	// 查找值必须为整形
	X修正查找方式_区间
)

// 通过实例的编号获得对应的值
// @schema_export --ident=schema --json --config=修正
// @schema_go
// @schema_ts
// @cache_go
// @cache_ts
// @alias 修正_读库
type B修正_读库 struct {
	B修正
	// 从该表中读取
	// @alias 库名
	B库名 string
	// 从该字段中读取
	// @alias 库字段
	Z库字段 string
}

type X修正字段类型 int

const (
	X修正字段类型_未知 X修正字段类型 = iota
	X修正字段类型_基础类型
	X修正字段类型_集合类型
)

// S修正公式_浮点数
// @schema_export --ident=schema --json --_type=修正公式
// @schema_go
// @schema_ts
// @cache_go
// @cache_ts
// @alias 修正公式_浮点数
type S修正公式_浮点数 struct {

	// @alias 方式
	F方式 F浮点数修正方式

	// 修正值
	// @alias 值
	X值 float64
}

// 加成修正类型
// @desc
type F浮点数修正方式 int

const (
	// 设置
	F浮点数修正方式_设置 F浮点数修正方式 = iota
	// 锁定
	F浮点数修正方式_锁定
	// 加
	F浮点数修正方式_加
	// 减
	F浮点数修正方式_减
	// 乘
	F浮点数修正方式_乘
	// 除
	F浮点数修正方式_除
)

// 修正目标类型
// @desc
type X修正目标类型 int

const (
	// 修正结构中的字段
	// 如果该字段为字典，则需要返回整个字典。通常为数量少于10字典，例如随机属性
	X修正目标类型_结构 X修正目标类型 = iota
	// 修正字典中的项
	// 针对字典中的项进行修正，通常用于项很多的情况，避免创建过多的项。例如等级、关卡
	X修正目标类型_字典
)

// 加成与系数
// y = x * (1 + Factor)* Multiplier  + Bonus
// y = x * (1 + 系数) * 乘数 + 加成
type BonusFactor struct {
	// 倍数计算后的加成
	// @alias 加成
	Bonus float64
	// @alias 系数
	Factor float64
	// @alias 倍数
	Multiplier float64 `value:"1"`
}

//func (bonus *BonusFactor) Clone() *BonusFactor {
//	return &BonusFactor{
//		Bonus:      bonus.Bonus,
//		Factor:     bonus.Factor,
//		Multiplier: bonus.Multiplier,
//	}
//}

func (bonus *BonusFactor) Add(a *BonusFactor) *BonusFactor {
	bonus.Bonus += a.Bonus
	bonus.Factor += a.Factor
	bonus.Multiplier *= a.Multiplier
	return bonus
}

func (bonus *BonusFactor) Scale(val int) *BonusFactor {
	bonus.Bonus *= float64(val)
	bonus.Factor *= float64(val)
	for i := 1; i < val; i++ {
		bonus.Multiplier *= bonus.Multiplier
	}

	return bonus
}
